#include "Computer.h"

//静态数据成员的初始化不能放在初始化列表中，也不能在声明的时候
//进行初始化，必须要放在类的外面进行初始化，特别的，当有头文件
//与实现文件的时候，要放在实现文件中，否则放在头文件中会出现
//多次定义的报错
//静态数据成员不会占用对象大小（类）,静态数据成员会存放在
//静态区,被该类的所有对象共享
double Computer::_totalPrice = 0;//总价

//注意：获取指针指向的变量的长度一定不要使用sizeof，因为
//sizeof得到的是指针大小的空间，只与系统相关
Computer::Computer(const char *brand, float price)
: _brand(new char[strlen(brand) + 1]())
, _price(price)
/* , _totalPrice(0)//静态数据成员不能再初始化列表中进行 */
{
    cout << "Computer(const char *, float)" << endl;
    strcpy(_brand, brand);
    _totalPrice += _price;
}

#if 0
//默认的拷贝构造函数,有时候不够用
Computer::Computer(const Computer &rhs)
: _brand(rhs._brand)//浅拷贝
, _price(rhs._price)
{
    cout << "Computer(const Computer &)" << endl;
}
#endif

//自定义的拷贝构造函数
Computer::Computer(const Computer &rhs)
: _brand(new char[strlen(rhs._brand) + 1]())//深拷贝
, _price(rhs._price)
{
    cout << "Computer(const Computer &)" << endl;
    strcpy(_brand, rhs._brand);
}
#if 0
//默认的赋值运算符不够用，需要改写
Computer &Computer::operator=(const Computer &rhs)
{
    cout << "Computer &operator=(const Computer &)" << endl;
    _brand = rhs._brand;
    _price = rhs._price;

    return *this;
}
#endif
Computer &Computer::operator=(const Computer &rhs)
{
    //左操作   右操作
    if(this != &rhs)//1、自赋值
    {
        delete [] _brand;//2、释放左操作数(否则内存泄漏)
        _brand = nullptr;

        //申请新空间,然后执行拷贝操作
        //(如果直接做拷贝会有内存越界的风险)
        _brand = new char[strlen(rhs._brand) + 1]();//3、深拷贝
        strcpy(_brand, rhs._brand);
        _price = rhs._price;
    }

    return *this;//4、返回对象本身
}

void Computer::setBrand(const char *brand)
{
    //没有考虑越界
    strcpy(_brand, brand);
}

void Computer::setPrice(float price)
{
    _price = price;
}

//隐含Computer * const this
void Computer::print()
{
    cout << "void Computer::print()" << endl;
    /* this->_price = 100;//ok */
    /* this = nullptr;//error */
    if(_brand)
    {
        cout << "_brand = " << this->_brand << endl
             << "_price = " << this->_price << endl;
    }
}

//隐含const Computer * const this
void Computer::print() const
{
    cout << "void Computer::print() const" << endl;
    /* this = nullptr;//error */
    /* this->_price = 100;//error */
    if(_brand)
    {
        cout << "_brand = " << this->_brand << endl
             << "_price = " << this->_price << endl;
    }

}

//1、静态成员函数的第一个参数的位置是没有隐含的this指针
//2、静态成员函数不能访问非静态数据成员与非静态成员函数
//3、非静态成员函数可以访问静态数据成员与静态成员函数
//4、静态成员函数可以使用对象或者直接使用类名与作用域限定符
//进行调用
//5、如果想在静态成员函数中访问非静态的数据成员或者成员，
//可以使用传参的方式
/* void Computer::printTotalPrice(Computer pc) */
void Computer::printTotalPrice()
{
    /* this;//error */
    cout << "_totalPrice = " << _totalPrice << endl;
    /* this->_price;//error */
    /* this->print();//error */
    /* pc.print(); */
    /* pc._price; */
}

//使用默认析构函数就已经不够用
//所以需要自定义
Computer::~Computer()
{
    cout << "~Computer()" << endl;
    _totalPrice -= _price;
    if(_brand)
    {
        delete [] _brand; 
        _brand = nullptr;
    }
}
